package com.tjetc.reflect;

import java.io.FileInputStream;
import java.io.IOException;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Properties;

@SuppressWarnings("all")
public class _1Reflect {

    /*
        反射：
        1.需求：
        根据配置⽂件cat.properties指定信息，创建Cat对象并调⽤⽅法hi
            classfullpath=com.tjetc.Cat Dog
            method=hi  hello
         传统方法解决：
            1. 加载配置文件properties
            2. getKey() classfullpath
            3. if path.equals("Cat")
            4. Cat cat = new Cat();
            5. if method.equals("hi")
            6. cat.hi()
         问题：
            虽然内容抽离出来了，但是如果发生变化还是需要修改源码重新进行编译
        2. 上述问题可以使用反射解决
     */
    public static void main(String[] args) throws IOException, ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {
        // 1. 加载配置文件
        Properties properties = new Properties();
        properties.load(new FileInputStream("/Users/gaoyongxiang/百度网盘/IDEA-Java/202507-java-se/chapter19/resource/cat.properties"));

        // 2. 获取配置文件中的属性
        String classpath = properties.getProperty("classpath");
        String method = properties.getProperty("method");
        System.out.println("classpath = " + classpath);
        System.out.println("method = " + method);

        // 3. 先根据类路径拿到class文件 获取类信息
        Class cls = Class.forName(classpath);

        // 4. 拿到类中公开的构造器
        Constructor constructor = cls.getDeclaredConstructor();

        // 5. 根据类中的构造器来创建对象
        Object o = constructor.newInstance();
        // 查看一下当前对象的运行时类型
        System.out.println("o.getClass() = " + o.getClass());

        // 6.根据你传进来的名称来获取到对象的方法
        Method method1 = cls.getMethod(method);

        // 7. 让该对象执行该方法
        method1.invoke(o);
    }

    public static void main1(String[] args) {
        _1Cat cat = new _1Cat();
        cat.hi();
    }

}
